﻿using System;

namespace Fennec
{

    public class Ville
    {
        public Carte carte { get; private set; }
        public System.Drawing.Point position { get; private set; }
        public int minerai { get; private set; }
        public int nourriture { get; private set; }
        public int population { get; private set; }

        private bool[,] territoire;
        private int nourriture_seuil_croissance;
        private bool nouvel_habitant_possible;

        public Ville(Carte carte, System.Drawing.Point pos)
        {
            this.carte = carte;
            this.position = pos;
            this.minerai = 0;
            this.nourriture = 0;
            this.population = 1;
            this.nourriture_seuil_croissance = 10;
            this.nouvel_habitant_possible = false;

            this.territoire = new bool[5, 5];
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    this.territoire[i, j] = false;
                }
            }
            this.territoire[2, 2] = true;
        }

        public void finirTour()
        {
            this.produireHabitant();
            this.nouvel_habitant_possible = true;
            this.collecterRessources();
        }

        /* -- production d'unités -- */

        public bool peutProduireDirecteur()
        {
            return this.minerai >= 200;
        }
        public void produireDirecteur()
        {
            if (peutProduireDirecteur())
            {
                this.minerai = 0;
            }
        }

        public bool peutProduireEtudiant()
        {
            return this.minerai >= 100;
        }
        public void produireEtudiant()
        {
            if (peutProduireEtudiant())
            {
                this.minerai = 0;
            }
        }

        public bool peutProduireEnseignant()
        {
            return this.minerai >= 60;
        }
        public void produireEnseignant()
        {
            if (peutProduireEnseignant())
            {
                this.minerai = 0;
                this.nouvel_habitant_possible = false;
            }
        }

        /* -- croissance de la population -- */

        public void produireHabitant()
        {
            if (this.nourriture >= this.nourriture_seuil_croissance && this.nouvel_habitant_possible)
            {
                this.population += 1;
                this.nourriture = 0;
                this.nourriture_seuil_croissance = this.nourriture_seuil_croissance + this.nourriture_seuil_croissance / 2;
                // tenter l'expansion du territoire
                for (int i = 0; i < 5 && this.nouvel_habitant_possible; i++)
                {
                    for (int j = 0; j < 5; j++)
                    {
                        if (!this.territoire[i, j])
                        {
                            this.territoire[i, j] = true;
                            this.nouvel_habitant_possible = false;
                            break;
                        }
                    }
                }
            }
        }

        /* -- gestion du territoire -- */

        public bool peutUtiliserCase(System.Drawing.Point position)
        {
            int dx = position.X - this.position.X;
            int dy = position.Y - this.position.Y;

            return dx <= 2 && dx >= -2 && dy <= 2 && dy >= -2
                && this.territoire[dx + 2, dy + 2]
                && this.carte.estCaseValide(position);
        }

        public bool peutVoirCase(System.Drawing.Point position)
        {
            int dx = position.X - this.position.X;
            int dy = position.Y - this.position.Y;
            return this.carte.estCaseValide(position) && (dx <= 3 && dx >= -3 && dy <= 3 && dy >= -3);
        }

        public void collecterRessources()
        {
            for (int i = 0; i < 5; i++)
            {
                for (int j = 0; j < 5; j++)
                {
                    if (!territoire[i, j])
                    {
                        continue;
                    }
                    System.Drawing.Point posCase = new System.Drawing.Point(this.position.X + i - 2, this.position.Y + j - 2);
                    if (this.carte.estCaseValide(posCase))
                    {
                        this.minerai += this.carte.getCase(posCase).minerai;
                        this.nourriture += this.carte.getCase(posCase).nourriture;
                    }
                }
            }
        }
    }
}